<?php
class CEMAIL extends AccessImpl {
	
	/**
	 * __construct
	 * 构造函数
	 * 接受一个字符串
	 *
	 * @param string $v        	
	 */
	public function __construct($v = "") {
		$this->setValue ( $v );
	}
	
	/**
	 * <h2>返回一个清理过的CEMAIL对象</h2>
	 *
	 * @return CEMAIL
	 */
	public function sanitize() {
		$sanitized = filter_var ( $this->_value, FILTER_SANITIZE_EMAIL );
		return new CEMAIL ( $sanitized );
	}
	
	/**
	 * <h2>判断是否是个合格的email地址</h2>
	 * 
	 * @return boolean
	 */
	public function isValid() {
		return self::validate ( $this->_value );
	}
	
	/**
	 * <h2>返回EMAIL字符串长度</h2>
	 *
	 * @return number
	 */
	public function length() {
		return strlen ( $this->_value );
	}
	
	/**
	 * <h2>判断EMAIL字符串是否为空</h2>
	 *
	 * @return boolean
	 */
	public function isEmpty() {
		return empty ( $this->_value );
	}
	
	/**
	 * Validate an email address.
	 * Provide email address (raw input)
	 * Returns true if the email address has the email
	 * address format and the domain exists.
	 *
	 * @param $mixed $v        	
	 * @return boolean
	 */
	public static function validate($email) {
		$isValid = true;
		$atIndex = strrpos ( $email, "@" );
		if (is_bool ( $atIndex ) && ! $atIndex) {
			$isValid = false;
		} else {
			$domain = substr ( $email, $atIndex + 1 );
			$local = substr ( $email, 0, $atIndex );
			$localLen = strlen ( $local );
			$domainLen = strlen ( $domain );
			if ($localLen < 1 || $localLen > 64) {
				// local part length exceeded
				$isValid = false;
			} else if ($domainLen < 1 || $domainLen > 255) {
				// domain part length exceeded
				$isValid = false;
			} else if ($local [0] == '.' || $local [$localLen - 1] == '.') {
				// local part starts or ends with '.'
				$isValid = false;
			} else if (preg_match ( '/\\.\\./', $local )) {
				// local part has two consecutive dots
				$isValid = false;
			} else if (! preg_match ( '/^[A-Za-z0-9\\-\\.]+$/', $domain )) {
				// character not valid in domain part
				$isValid = false;
			} else if (preg_match ( '/\\.\\./', $domain )) {
				// domain part has two consecutive dots
				$isValid = false;
			} else if (! preg_match ( '/^(\\\\.|[A-Za-z0-9!#%&`_=\\/$\'*+?^{}|~.-])+$/', str_replace ( "\\\\", "", $local ) )) {
				// character not valid in local part unless
				// local part is quoted
				if (! preg_match ( '/^"(\\\\"|[^"])+"$/', str_replace ( "\\\\", "", $local ) )) {
					$isValid = false;
				}
			}
			/*
			 * if ($isValid && ! (checkdnsrr ( $domain, "MX" ) || checkdnsrr (
			 * $domain, "A" ))) { // domain not found in DNS $isValid = false; }
			 */
		}
		return $isValid;
	}
}